package br.com.stefanini.schs.ejb.sessionBean;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.stefanini.schs.ejb.entity.Atividade;
import br.com.stefanini.schs.ejb.entity.Funcionario;
import br.com.stefanini.schs.ejb.entity.Ponto;

@Stateless
public class AtividadeSessionBean {

	@PersistenceContext
	private EntityManager entityManager;

	public void incluirAtividade(Atividade atividade) {
		
		Ponto ponto = entityManager.find(Ponto.class, atividade.getPonto().getIdPonto());
		atividade.setPonto(ponto);
		this.entityManager.persist(atividade);
	}
		
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesFuncionarioDia(long idPonto){
		Query query = entityManager.createNamedQuery("Atividade.consultarAtividadeFuncionarioDia");
		query.setParameter("idPonto", idPonto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}		

	@SuppressWarnings("unchecked")
	public List<Atividade> consultaTodasAtividadesFuncionarios(){
		Query query = entityManager.createNamedQuery("Atividade.consultarTodasAtividades");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Date> consultaHorasTrabalhadas(Long idPonto){
		Query query = entityManager.createNativeQuery("select horastrabalhadas from atividade where current_date = cast (horastrabalhadas as date) and fk_idponto = ?");                           
		query.setParameter(1, idPonto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Date> consultaHorasTrabalhadasProjetoMes(Long idProjeto, Long mes, Long ano, Long idFuncionario){
		Query query = entityManager.createQuery("select a.horasTrabalhadas From Atividade a where MONTH(a.horasTrabalhadas) = :mes and year(a.horasTrabalhadas) = :ano and a.projeto.idProjeto = :idProjeto and a.ponto.funcionario.idFuncionario = :idFuncionario ");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Date> consultaHorasTrabalhadasProjetoDesvinculadosMes(Long idProjeto, Long mes, Long ano, Long idFuncionario){
		Query query = entityManager.createQuery("select a.horasTrabalhadas From Atividade a where MONTH(a.horasTrabalhadas) = :mes and year(a.horasTrabalhadas) = :ano and a.ponto.funcionario.idFuncionario = :idFuncionario and :idProjeto not in (select fp from FuncionarioProjeto fp where fp.pk.idFuncionario = :idFuncionario) ");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesFuncionarioAnoMes(Long idFuncionario, Long mes, Long ano){
		Query query = entityManager.createQuery("select a from Atividade a WHERE a.ponto.funcionario.idFuncionario = :idFuncionario and  MONTH(a.ponto.horaEntrada) = :mes and year(a.ponto.horaEntrada) = :ano");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesFuncionarioAnoMesProjeto(Long idFuncionario, Long mes, Long ano, Long idProjeto){
		Query query = entityManager.createQuery("select a from Atividade a WHERE a.ponto.funcionario.idFuncionario = :idFuncionario and  MONTH(a.ponto.horaEntrada) = :mes and year(a.ponto.horaEntrada) = :ano and a.projeto.idProjeto = :idProjeto");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		query.setParameter("idProjeto", idProjeto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesFuncionarioAno(Long idFuncionario, Long ano){
		Query query = entityManager.createQuery("select a from Atividade a WHERE a.ponto.funcionario.idFuncionario = :idFuncionario and  year(a.ponto.horaEntrada) = :ano");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesFuncionarioAnoProjeto(Long idFuncionario, Long ano, Long idProjeto){
		Query query = entityManager.createQuery("select a from Atividade a WHERE a.ponto.funcionario.idFuncionario = :idFuncionario and  year(a.ponto.horaEntrada) = :ano and a.projeto.idProjeto = :idProjeto");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesFuncionarioMes(Long idFuncionario, Long mes){
		Query query = entityManager.createQuery("select a from Atividade a WHERE a.ponto.funcionario.idFuncionario = :idFuncionario and  MONTH(a.ponto.horaEntrada) = :mes");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesFuncionarioMesProjeto(Long idFuncionario, Long mes,Long idProjeto){
		Query query = entityManager.createQuery("select a from Atividade a WHERE a.ponto.funcionario.idFuncionario = :idFuncionario and  MONTH(a.ponto.horaEntrada) = :mes and a.projeto.idProjeto = :idProjeto");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesProjeto(String descricaoAtividade, Long idProjeto){
		Query query = entityManager.createNamedQuery("Atividade.consultarAtividadeProjeto");
		query.setParameter("descricaoAtividade", descricaoAtividade + "%");
		query.setParameter("idProjeto", idProjeto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesTrabalhadasProjetoMesAno(Long mes, Long ano, Long idProjeto){
		Query query = entityManager.createQuery("select a From Atividade a where MONTH(a.horasTrabalhadas) = :mes and year(a.horasTrabalhadas) = :ano and a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesTrabalhadasProjetoMes(Long mes, Long idProjeto){
		Query query = entityManager.createQuery("select a From Atividade a where MONTH(a.horasTrabalhadas) = :mes  and a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesTrabalhadasProjetoAno(Long ano, Long idProjeto){
		Query query = entityManager.createQuery("select a From Atividade a where year(a.horasTrabalhadas) = :ano and a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultaAtividadesTrabalhadasProjeto(Long idProjeto){
		Query query = entityManager.createQuery("select a From Atividade a where a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	public Long contarFuncionarioProjetoMesAno(Long mes, Long ano, Long idProjeto){
		Query query = entityManager.createQuery("select count(distinct a.ponto.funcionario) From Atividade a where MONTH(a.horasTrabalhadas) = :mes and year(a.horasTrabalhadas) = :ano and a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return  (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}
	public Long contarFuncionarioProjetoMes(Long mes, Long idProjeto){
		Query query = entityManager.createQuery("select count(distinct a.ponto.funcionario) From Atividade a where MONTH(a.horasTrabalhadas) = :mes and a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		try {
			return  (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}
	public Long contarFuncionarioProjetoAno(Long ano, Long idProjeto){
		Query query = entityManager.createQuery("select count(distinct a.ponto.funcionario) From Atividade a where year(a.horasTrabalhadas) = :ano and a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return  (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}
	public Long contarFuncionarioProjeto(Long idProjeto){
		Query query = entityManager.createQuery("select count(distinct a.ponto.funcionario) From Atividade a where a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		try {
			return  (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Funcionario> listarFuncionarioProjeto(Long idProjeto){
		Query query = entityManager.createQuery("select distinct a.ponto.funcionario From Atividade a where a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		try {
			return  query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Funcionario> listarFuncionarioProjetoAno(Long ano, Long idProjeto){
		Query query = entityManager.createQuery("select distinct a.ponto.funcionario From Atividade a where year(a.horasTrabalhadas) = :ano and a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return  query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Funcionario> listarFuncionarioProjetoMes(Long mes, Long idProjeto){
		Query query = entityManager.createQuery("select distinct a.ponto.funcionario From Atividade a where MONTH(a.horasTrabalhadas) = :mes and a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		try {
			return  query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Funcionario> listarFuncionarioProjetoMesAno(Long mes, Long ano, Long idProjeto){
		Query query = entityManager.createQuery("select distinct a.ponto.funcionario From Atividade a where MONTH(a.horasTrabalhadas) = :mes and year(a.horasTrabalhadas) = :ano and a.projeto.idProjeto = :idProjeto");                         
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return  query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Date> buscarHorasTrabalhadasFuncionario(Long idFuncionario, Long idProjeto){
		Query query = entityManager.createQuery("select a.horasTrabalhadas from Atividade a where a.ponto.funcionario.idFuncionario = :idFuncionario and a.projeto.idProjeto = :idProjeto");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("idProjeto", idProjeto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> buscarAtividadesTrabalhadasFuncionario(Long idFuncionario, Long idProjeto){
		Query query = entityManager.createQuery("select a from Atividade a where a.ponto.funcionario.idFuncionario = :idFuncionario and a.projeto.idProjeto = :idProjeto");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("idProjeto", idProjeto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> listarAtividadesFuncionario(Long idFuncionario, Long idProjeto){
		Query query = entityManager.createNamedQuery("Atividade.consultaAtividadesFuncionarioProjeto");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("idProjeto", idProjeto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultarAtividadesFuncionario(Long idFuncionario){
		Query query = entityManager.createNamedQuery("Atividade.consultarTodasAtividadesFuncionario");
		query.setParameter("idFuncionario", idFuncionario);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultarAtividadesFuncionarioProjeto(Long idFuncionario, Long idProjeto){
		Query query = entityManager.createNamedQuery("Atividade.consultarTodasAtividadesFuncionarioProjeto");
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("idFuncionario", idFuncionario);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Atividade> consultarAtividadesFuncionarioProjetoAno(Long idFuncionario, Long idProjeto, Long ano){
		Query query = entityManager.createQuery("select a from Atividade a where a.ponto.funcionario.idFuncionario = :idFuncionario and a.projeto.idProjeto = :idProjeto and year(a.ponto.horaEntrada) = :ano");
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultarAtividadesFuncionarioProjetoMes(Long idFuncionario, Long idProjeto, Long mes){
		Query query = entityManager.createQuery("select a from Atividade a where a.ponto.funcionario.idFuncionario = :idFuncionario and a.projeto.idProjeto = :idProjeto and MONTH(a.ponto.horaEntrada) = :mes");
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultarAtividadesFuncionarioProjetoMesAno(Long idFuncionario, Long idProjeto, Long mes, Long ano){
		Query query = entityManager.createQuery("select a from Atividade a where a.ponto.funcionario.idFuncionario = :idFuncionario and a.projeto.idProjeto = :idProjeto and MONTH(a.ponto.horaEntrada) = :mes and year(a.ponto.horaEntrada) = :ano");
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Atividade> consultarDescricaoAtividadeAutoComplete(String descricao){
		Query query = entityManager.createNamedQuery("Atividade.consultarDescricaoAutoComplete");
		query.setParameter("descricao", "%" + descricao + "%");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultarAtividadePorDescricao(String descricao){
		Query query = entityManager.createNamedQuery("Atividade.consultarAtividadePorDescricao");
		query.setParameter("descricao", "%" + descricao + "%");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	@SuppressWarnings("unchecked")
	public List<Atividade> consultarAtividadeFuncionarioProjeto(Long idFuncionario, Long idProjeto){
		Query query = entityManager.createNamedQuery("Atividade.consultarAtividadeFuncionarioProjeto");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("idProjeto", idProjeto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
		
	}
	
	public Long consultarAtividadeFuncionarioProjetoPonto(Long idFuncionario, Long idProjeto, Long dia, Long mes, Long ano){
		Query query = entityManager.createQuery("select count(a) from Atividade a where a.projeto.idProjeto = :idProjeto and a.ponto.funcionario.idFuncionario = :idFuncionario and day(a.ponto.horaEntrada) = :dia and MONTH(a.ponto.horaEntrada) = :mes and year(a.ponto.horaEntrada) = :ano");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("idProjeto", idProjeto);
		query.setParameter("dia", Integer.parseInt(String.valueOf(dia)));
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}
}